package user

import (
	"clouds.lgb24kcs.cn/controllers/user/request"
	"clouds.lgb24kcs.cn/errorx"
	"clouds.lgb24kcs.cn/global"
	"clouds.lgb24kcs.cn/models"
	"clouds.lgb24kcs.cn/utils"
	"github.com/gin-gonic/gin"
	"time"
)

type UserFun struct {
}

var UserApi UserFun

func (u *UserFun) Login(c *gin.Context, req request.LoginReq) {
	user := models.User{}

	err := global.APP.DB.Where("mobile=? and password=?", req.Mobile, req.Password).First(&user).Error
	if err != nil {
		utils.Fail(c, errorx.UserLogin, "登录失败，用户或密码错误")
		global.APP.Log.Error(err.Error())
	} else {

		token, err := utils.CreateToken(int64(user.ID))
		now := time.Now().Unix()
		if err != nil {
			global.APP.Log.Error(err.Error())

			utils.Fail(c, errorx.UserLogin, err.Error())
		} else {
			UserInfo := request.LoginRes{
				Id:           int64(user.ID),
				Username:     user.Username,
				Token:        token,
				ExpireAt:     now + global.APP.Configuration.Server.AccessExpire,
				RefreshAfter: now + global.APP.Configuration.Server.AccessExpire/2,
			}
			utils.Success(c, 0, UserInfo)
		}
	}

}

func (u UserFun) SMCode(c *gin.Context, req request.SMCodeReq) {
	user := models.User{}

	// 短信验证码登录
	err := global.APP.DB.Where("mobile=?", req.Mobile).First(&user).Error
	if err != nil {
		userInfo := models.User{
			Mobile:   req.Mobile,
			Username: req.Mobile,
		}
		// 如果短信方式登录时没有在数据库中查询到对应的手机号就自动注册,登录
		err := global.APP.DB.Create(&userInfo).Error
		if err != nil {
			global.APP.Log.Error(err.Error())
			utils.Fail(c, errorx.UserLogin, err.Error())
		} else {
			token, err := utils.CreateToken(int64(user.ID))
			now := time.Now().Unix()
			if err != nil {
				global.APP.Log.Error(err.Error())
				utils.Fail(c, errorx.UserLogin, err.Error())
			} else {
				UserInfo := request.LoginRes{
					Id:           int64(userInfo.ID),
					Username:     userInfo.Username,
					Token:        token,
					ExpireAt:     now + global.APP.Configuration.Server.AccessExpire,
					RefreshAfter: now + global.APP.Configuration.Server.AccessExpire/2,
				}
				utils.Success(c, 0, UserInfo)
			}
		}
	} else {
		token, err := utils.CreateToken(int64(user.ID))
		now := time.Now().Unix()
		if err != nil {
			global.APP.Log.Error(err.Error())

			utils.Fail(c, errorx.UserLogin, err.Error())
		} else {
			UserInfo := request.LoginRes{
				Id:           int64(user.ID),
				Username:     user.Username,
				Token:        token,
				ExpireAt:     now + global.APP.Configuration.Server.AccessExpire,
				RefreshAfter: now + global.APP.Configuration.Server.AccessExpire/2,
			}
			utils.Success(c, 0, UserInfo)
		}
	}
}
